package com.desire.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

import javax.servlet.http.HttpServletRequest;

/**
 * @Description:
 * @Author: littleDesire
 * @Date: 2022-06-09 17:43
 * @Version: 1.0
 */
public class TokenFilter extends ZuulFilter {
    /**
     * 过滤器类型 pre：可以在请求被路由之前调用 post：可以在请求被路由之后调用 error：可以在请求出错时调用
     *
     * @return 返回一个字符串代表过滤器的类型，在配置文件中，通过该类型，来配置过滤器
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器的执行顺序，数字越小，优先级越高 过滤器的执行顺序是从上到下，从左到右 所以这里的优先级要比前一个过滤器的优先级高
     *
     * @return 返回一个优先级。返回负数表示优先级，越小的优先级越高。
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 过滤器是否需要执行，如果该过滤器不需要执行，则返回false 如果需要执行，则返回true
     *
     * @return 返回一个boolean值，表示该过滤器是否要执行。
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的具体逻辑 在该方法中，可以进行请求的过滤和响应的处理
     *
     * @return 返回一个字符串，表示过滤器的名称
     * @throws ZuulException 如果过滤器执行过程中出现错误，则抛出该异常
     */
    @Override
    public Object run() throws ZuulException {
        // 获取请求上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        // 获取请求
        HttpServletRequest request = ctx.getRequest();
        // 获取请求的token
        String token = request.getHeader("token");
        // 判断token是否为空
        if (token == null) {
            // 如果token为空，说明无权访问  直接返回，不进行路由
            ctx.setSendZuulResponse(false);
            // 设置网关响应客户端的内容
            ctx.getResponse().setContentType("application/json;charset=utf-8");
            ctx.setResponseBody("{\"code\":\"401\",\"msg\":\"无权访问\"}");
        }

        ctx.set("token", token);
        return null;
    }
}
